﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ProcelNasEscolas.Model.Fichas;
using ProcelNasEscolas.Model.Interfaces;
using ProcelNasEscolas.Model.Respostas;
using ProcelNasEscolas.Model;

namespace ProcelNasEscolas.Data
{
    public class QuestionarioAlunosTreinados2Dao : AbstractCrudDao<QuestionarioAlunosTreinados2Data>, IQuestionarioAlunosTreinados2Dao 
    {
        public QuestionarioAlunosTreinados2 ToModelObject(QuestionarioAlunosTreinados2Data questionarioData)
        {
            QuestionarioAlunosTreinados2 questionarioModel = new QuestionarioAlunosTreinados2();
            questionarioModel.Questoes.Clear();
            questionarioModel.DataDePreenchimento = questionarioData.DataDePreenchimento;
            questionarioModel.Id = questionarioData.Id;
            questionarioModel.Questionado = new EntidadeDao().ToModelObject(questionarioData.IEntidadeData);
            questionarioData.QuestaoData.Load();


            foreach (QuestaoData dataQuestions in questionarioData.QuestaoData)
            {
                QuestaoData temp = (from c in this.GetObjectContext().QuestaoDataSet.Include("RespostaBase") where c.Id == dataQuestions.Id select c).First();
                questionarioModel.Questoes.Add(new QuestaoDao().ToModelObject(temp));
            }

            return questionarioModel;
        }

        public QuestionarioAlunosTreinados2Data CreateOrUpdate(QuestionarioAlunosTreinados2 questionarioModel)
        {
            try
            {
                QuestionarioAlunosTreinados2Data questionarioData = new QuestionarioAlunosTreinados2Data();

                IList<QuestionarioAlunosTreinados2Data> questionarios = this.GetObjectContext().IQuestionarioDataSet.OfType<QuestionarioAlunosTreinados2Data>()
                    .Where(questionarioConsulta => questionarioConsulta.Id == questionarioModel.Id).ToList();

                if (questionarios.Count == 0)
                {
                    this.Add("IQuestionarioDataSet", questionarioData);
                }
                else
                {
                    questionarioData = questionarios.First();
                }

                questionarioData.DataDePreenchimento = questionarioModel.DataDePreenchimento;
                IEntidadeData entidadeTemp = new EntidadeDao().CreateOrUpdate(questionarioModel.Questionado);
                questionarioData.IEntidadeData = this.GetObjectContext().IEntidadeDataSet.OfType<IEntidadeData>()
                    .Where(entidadeConsulta => entidadeConsulta.Id == entidadeTemp.Id).First();

                questionarioData.QuestaoData.Clear();

                foreach (Questao questao in questionarioModel.Questoes)
                {
                    questionarioData.QuestaoData.Add(new QuestaoDao().CreateDataObject(questao));
                }

                this.SaveChanges();

                return questionarioData;
            }
            catch (Exception e)
            {
                System.Console.Out.WriteLine("" + e);
                return null;
            }
        }

        public QuestionarioAlunosTreinados2 GetQuestionario(int Id)
        {
            try
            {
                IQuestionarioData questionario = (from c in this.GetObjectContext().IQuestionarioDataSet.Include("IEntidadeData") where c.Id == Id select c).First();
                AlunoData alunoTemp = (AlunoData)questionario.IEntidadeData;
                alunoTemp = (from c in this.GetObjectContext().IEntidadeDataSet.OfType<AlunoData>().Include("TurmaData").Include("TurmaData.EscolaData") where c.Id == questionario.IEntidadeData.Id select c).First();
                questionario.IEntidadeData = alunoTemp;
                questionario.QuestaoData.Load();

                return this.ToModelObject((QuestionarioAlunosTreinados2Data)questionario);
            }
            catch (Exception e)
            {
                System.Console.Out.WriteLine("" + e);
                return null;
            }
        }

        public IList<QuestionarioAlunosTreinados2> GetAll()
        {
            IList<QuestionarioAlunosTreinados2Data> questionarios = (from c in this.GetObjectContext().IQuestionarioDataSet.Include("IEntidadeData").OfType<QuestionarioAlunosTreinados2Data>() select c).ToList();

            IList<QuestionarioAlunosTreinados2> questionariosModel = new List<QuestionarioAlunosTreinados2>();

            foreach (QuestionarioAlunosTreinados2Data questionario in questionarios)
            {
                AlunoData alunoTemp = (AlunoData)questionario.IEntidadeData;
                alunoTemp = (from c in this.GetObjectContext().IEntidadeDataSet.OfType<AlunoData>().Include("TurmaData").Include("TurmaData.EscolaData") where c.Id == questionario.IEntidadeData.Id select c).First();
                questionario.IEntidadeData = alunoTemp;
                questionario.QuestaoData.Load();
                questionariosModel.Add(this.ToModelObject(questionario));
            }

            return questionariosModel;
        }
    }
}
